home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / lib / tex / pooltype.tex (.txt) < prev    next >
Texinfo Document  |  1985-06-03  |  21KB  |  462 lines

  1. \input webhdr
  2. % This program by D. E. Knuth is not copyrighted and can be used freely.
  3. % Version 1 was implemented in June 1982.
  4. % Slight changes were made in October, 1982, for version 0.6 of TeX.
  5. % Here is TeX material that gets inserted after \input webhdr
  6. \def\hang{\hangindent 3em\indent\ignorespaces}
  7. \font\ninerm=cmr9
  8. \let\mc=\ninerm % medium caps for names like PASCAL
  9. \def\PASCAL{{\mc PASCAL}}
  10. \def\(#1){} % this is used to make module names sort themselves better
  11. \def\9#1{} % this is used for sort keys in the index
  12. \def\title{POOL\lowercase{type}}
  13. \def\contentspagenumber{101}
  14. \def\topofcontents{\null
  15.   \def\titlepage{F} % include headline on the contents page
  16.   \def\rheader{\mainfont\hfil \contentspagenumber}
  17.   \vfill
  18.   \centerline{\titlefont The {\ttitlefont POOLtype} processor}
  19.   \vskip 15pt
  20.   \centerline{(Version 1, June 1982)}
  21.   \vfill}
  22. \def\botofcontents{\vfill
  23.   \centerline{\hsize 5in\baselineskip9pt
  24.     \vbox{\ninerm\noindent
  25.     The preparation of this report
  26.     was supported in part by the National Science
  27.     Foundation under grants IST-8201926 and MCS-7723738,
  28.     and by the System Development Foundation. `\TeX' is a
  29.     trademark of the American Mathematical Society.}}}
  30. \setcount0=\contentspagenumber \advcount0 by 1
  31. \N1.  Introduction.
  32. The \.{POOLtype} utility program converts string pool files output
  33. by \.{TANGLE} into a slightly more symbolic format that may be useful
  34. when \.{TANGLE}d programs are being debugged.
  35. It's a pretty trivial routine, but people may want to try transporting
  36. this program before they get up enough courage to tackle \TeX\ itself.
  37. The first 128 strings are treated as \TeX\ treats them, using routines
  38. copied from \TeX82.
  39. \M2. \.{POOLtype} is written entirely in standard \PASCAL, except that it has
  40. to do some slightly system-dependent character code conversion on input
  41. and output. The input is read from \\{pool\_file}, and the output is written
  42. on \\{output}. If the input is erroneous, the \\{output} file will describe
  43. the error.
  44. \Y\P\4\&{program}\1\  \37$\\{POOLtype}(\\{pool\_file},\39\\{output})$;\6
  45. \4\&{label} \379999;\C{this labels the end of the program}\6
  46. \4\&{type} \37\X5:Types in the outer block\X\6
  47. \4\&{var} \37\X7:Globals in the outer block\X\6
  48. \4\&{procedure}\1\  \37\\{initialize};\C{this procedure gets things started
  49. properly}\6
  50. \4\&{var} \37\X6:Local variables for initialization\X\2\6
  51. \&{begin} \37\X8:Set initial values of key variables\X\6
  52. \&{end};\par
  53. \M3. Here are some macros for common programming idioms.
  54. \Y\P\D \37$\\{incr}(\#)\S\#\K\#+1$\C{increase a variable by unity}\par
  55. \P\D \37$\\{decr}(\#)\S\#\K\#-1$\C{decrease a variable by unity}\par
  56. \P\D \37$\\{do\_nothing}\S$\C{empty statement}\par
  57. \N4.  The character set.
  58. (The following material is copied verbatim from \TeX82.
  59. Thus, the same system-dependent changes should be made to both programs.)
  60. In order to make \TeX\ readily portable between a wide variety of
  61. computers, all of its input text is converted to an internal seven-bit
  62. code that is essentially standard ascii, the ``American Standard Code for
  63. Information Interchange.''  This conversion is done immediately when each
  64. character is read in. Conversely, characters are converted from ascii to
  65. the user's external representation just before they are output to a
  66. text file.
  67. Such an internal code is relevant to users of \TeX\ primarily because it
  68. governs the positions of characters in the fonts. For example, the
  69. character `\.A' has ascii code $65=\O{101}$, and when \TeX\ typesets
  70. this letter it specifies character number 65 in the current font.
  71. If that font actually has `\.A' in a different position, \TeX\ doesn't
  72. know what the real position is; the program that does the actual printing from
  73. \TeX's device-independent files is responsible for converting from ascii to
  74. a particular font encoding.
  75. \TeX's internal code is relevant also with respect to constants
  76. that begin with a reverse apostrophe; and it provides an index to the
  77. \.{\\chcode}, \.{\\mathcode}, \.{\\uccode}, \.{\\lccode}, and \.{\\delcode}
  78. tables.
  79. \M5. Characters of text that have been converted to \TeX's internal form
  80. are said to be of type \\{ascii\_code}, which is a subrange of the integers.
  81. \Y\P$\4\X5:Types in the outer block\X\S$\6
  82. $\\{ascii\_code}=0\to127$;\C{seven-bit numbers}\par
  83. \U section 2.\fi
  84. \M6. The original \PASCAL\ compiler was designed in the late 60s, when six-bit
  85. character sets were common, so it did not make provision for lower case
  86. letters. Nowadays, of course, we need to deal with both upper and lower case
  87. alphabets in a convenient way, especially in a program for typesetting;
  88. so the present specification of \TeX\ has been written under the assumption
  89. that the \PASCAL\ compiler and run-time system permit the use of text files
  90. with more than 64 distinguishable characters. More precisely, we assume that
  91. the character set contains at least the letters and symbols associated
  92. with ascii codes \O{40} through \O{176}; all of these characters are now
  93. available on most computer terminals.
  94. Since we are dealing with more characters than were present in the first
  95. \PASCAL\ compilers, we have to decide what to call the associated data
  96. type. Some \PASCAL s use the original name \\{char} for the
  97. characters in text files, even though there now are more than 64 such
  98. characters, while other \PASCAL s consider \\{char} to be a 64-element
  99. subrange of a larger data type that has some other name.
  100. In order to accommodate this difference, we shall use the name \\{text\_char}
  101. to stand for the data type of the characters that are converted to and
  102. from \\{ascii\_code} when they are input and output. We shall also assume
  103. that \\{text\_char} consists of the elements $\\{chr}(\\{first\_text\_char})$
  104. through
  105. $\\{chr}(\\{last\_text\_char})$, in\-clu\-sive. The following definitions
  106. should be
  107. adjusted if necessary.
  108. \Y\P\D \37$\\{text\_char}\S\\{char}$\C{the data type of characters in text
  109. files}\par
  110. \P\D \37$\\{first\_text\_char}=0$\C{ordinal number of the smallest element of \\
  111. {text\_char}}\par
  112. \P\D \37$\\{last\_text\_char}=127$\C{ordinal number of the largest element of \\
  113. {text\_char}}\par
  114. \Y\P$\4\X6:Local variables for initialization\X\S$\6
  115. \4\|i: \37$0\to\\{last\_text\_char}$;\par
  116. \U section 2.\fi
  117. \M7. The \TeX\ processor converts between ascii code and
  118. the user's external character set by means of arrays \\{xord} and \\{xchr}
  119. that are analogous to \PASCAL's \\{ord} and \\{chr} functions.
  120. \Y\P$\4\X7:Globals in the outer block\X\S$\6
  121. \4\\{xord}: \37\&{array} $[\\{text\_char}]$ \1\&{of}\5
  122. \\{ascii\_code};\C{specifies conversion of input characters}\2\6
  123. \4\\{xchr}: \37\&{array} $[\\{ascii\_code}]$ \1\&{of}\5
  124. \\{text\_char};\C{specifies conversion of output characters}\2\par
  125. \A sections 12, 13, and 18.
  126. \U section 2.\fi
  127. \M8. Since we are assuming that our \PASCAL\ system is able to read and write
  128. visible characters of standard ascii (although not necessarily using the
  129. ascii codes to represent them), the following assignment statements initialize
  130. most of the \\{xchr} array properly, without needing any system-dependent
  131. changes.
  132. \Y\P$\4\X8:Set initial values of key variables\X\S$\6
  133. $\\{xchr}[\O{40}]\K\.{\'\ \'}$;\5
  134. $\\{xchr}[\O{41}]\K\.{\'!\'}$;\5
  135. $\\{xchr}[\O{42}]\K\.{\'"\'}$;\5
  136. $\\{xchr}[\O{43}]\K\.{\'\#\'}$;\5
  137. $\\{xchr}[\O{44}]\K\.{\'\$\'}$;\5
  138. $\\{xchr}[\O{45}]\K\.{\'\%\'}$;\5
  139. $\\{xchr}[\O{46}]\K\.{\'\&\'}$;\5
  140. $\\{xchr}[\O{47}]\K\.{\'\'}\.{\'\'}$;\6
  141. $\\{xchr}[\O{50}]\K\.{\'(\'}$;\5
  142. $\\{xchr}[\O{51}]\K\.{\')\'}$;\5
  143. $\\{xchr}[\O{52}]\K\.{\'*\'}$;\5
  144. $\\{xchr}[\O{53}]\K\.{\'+\'}$;\5
  145. $\\{xchr}[\O{54}]\K\.{\',\'}$;\5
  146. $\\{xchr}[\O{55}]\K\.{\'-\'}$;\5
  147. $\\{xchr}[\O{56}]\K\.{\'.\'}$;\5
  148. $\\{xchr}[\O{57}]\K\.{\'/\'}$;\6
  149. $\\{xchr}[\O{60}]\K\.{\'0\'}$;\5
  150. $\\{xchr}[\O{61}]\K\.{\'1\'}$;\5
  151. $\\{xchr}[\O{62}]\K\.{\'2\'}$;\5
  152. $\\{xchr}[\O{63}]\K\.{\'3\'}$;\5
  153. $\\{xchr}[\O{64}]\K\.{\'4\'}$;\5
  154. $\\{xchr}[\O{65}]\K\.{\'5\'}$;\5
  155. $\\{xchr}[\O{66}]\K\.{\'6\'}$;\5
  156. $\\{xchr}[\O{67}]\K\.{\'7\'}$;\6
  157. $\\{xchr}[\O{70}]\K\.{\'8\'}$;\5
  158. $\\{xchr}[\O{71}]\K\.{\'9\'}$;\5
  159. $\\{xchr}[\O{72}]\K\.{\':\'}$;\5
  160. $\\{xchr}[\O{73}]\K\.{\';\'}$;\5
  161. $\\{xchr}[\O{74}]\K\.{\'<\'}$;\5
  162. $\\{xchr}[\O{75}]\K\.{\'=\'}$;\5
  163. $\\{xchr}[\O{76}]\K\.{\'>\'}$;\5
  164. $\\{xchr}[\O{77}]\K\.{\'?\'}$;\6
  165. $\\{xchr}[\O{100}]\K\.{\'\@\'}$;\5
  166. $\\{xchr}[\O{101}]\K\.{\'A\'}$;\5
  167. $\\{xchr}[\O{102}]\K\.{\'B\'}$;\5
  168. $\\{xchr}[\O{103}]\K\.{\'C\'}$;\5
  169. $\\{xchr}[\O{104}]\K\.{\'D\'}$;\5
  170. $\\{xchr}[\O{105}]\K\.{\'E\'}$;\5
  171. $\\{xchr}[\O{106}]\K\.{\'F\'}$;\5
  172. $\\{xchr}[\O{107}]\K\.{\'G\'}$;\6
  173. $\\{xchr}[\O{110}]\K\.{\'H\'}$;\5
  174. $\\{xchr}[\O{111}]\K\.{\'I\'}$;\5
  175. $\\{xchr}[\O{112}]\K\.{\'J\'}$;\5
  176. $\\{xchr}[\O{113}]\K\.{\'K\'}$;\5
  177. $\\{xchr}[\O{114}]\K\.{\'L\'}$;\5
  178. $\\{xchr}[\O{115}]\K\.{\'M\'}$;\5
  179. $\\{xchr}[\O{116}]\K\.{\'N\'}$;\5
  180. $\\{xchr}[\O{117}]\K\.{\'O\'}$;\6
  181. $\\{xchr}[\O{120}]\K\.{\'P\'}$;\5
  182. $\\{xchr}[\O{121}]\K\.{\'Q\'}$;\5
  183. $\\{xchr}[\O{122}]\K\.{\'R\'}$;\5
  184. $\\{xchr}[\O{123}]\K\.{\'S\'}$;\5
  185. $\\{xchr}[\O{124}]\K\.{\'T\'}$;\5
  186. $\\{xchr}[\O{125}]\K\.{\'U\'}$;\5
  187. $\\{xchr}[\O{126}]\K\.{\'V\'}$;\5
  188. $\\{xchr}[\O{127}]\K\.{\'W\'}$;\6
  189. $\\{xchr}[\O{130}]\K\.{\'X\'}$;\5
  190. $\\{xchr}[\O{131}]\K\.{\'Y\'}$;\5
  191. $\\{xchr}[\O{132}]\K\.{\'Z\'}$;\5
  192. $\\{xchr}[\O{133}]\K\.{\'[\'}$;\5
  193. $\\{xchr}[\O{134}]\K\.{\'\\\'}$;\5
  194. $\\{xchr}[\O{135}]\K\.{\']\'}$;\5
  195. $\\{xchr}[\O{136}]\K\.{\'\^\'}$;\5
  196. $\\{xchr}[\O{137}]\K\.{\'\_\'}$;\6
  197. $\\{xchr}[\O{140}]\K\.{\'\`\'}$;\5
  198. $\\{xchr}[\O{141}]\K\.{\'a\'}$;\5
  199. $\\{xchr}[\O{142}]\K\.{\'b\'}$;\5
  200. $\\{xchr}[\O{143}]\K\.{\'c\'}$;\5
  201. $\\{xchr}[\O{144}]\K\.{\'d\'}$;\5
  202. $\\{xchr}[\O{145}]\K\.{\'e\'}$;\5
  203. $\\{xchr}[\O{146}]\K\.{\'f\'}$;\5
  204. $\\{xchr}[\O{147}]\K\.{\'g\'}$;\6
  205. $\\{xchr}[\O{150}]\K\.{\'h\'}$;\5
  206. $\\{xchr}[\O{151}]\K\.{\'i\'}$;\5
  207. $\\{xchr}[\O{152}]\K\.{\'j\'}$;\5
  208. $\\{xchr}[\O{153}]\K\.{\'k\'}$;\5
  209. $\\{xchr}[\O{154}]\K\.{\'l\'}$;\5
  210. $\\{xchr}[\O{155}]\K\.{\'m\'}$;\5
  211. $\\{xchr}[\O{156}]\K\.{\'n\'}$;\5
  212. $\\{xchr}[\O{157}]\K\.{\'o\'}$;\6
  213. $\\{xchr}[\O{160}]\K\.{\'p\'}$;\5
  214. $\\{xchr}[\O{161}]\K\.{\'q\'}$;\5
  215. $\\{xchr}[\O{162}]\K\.{\'r\'}$;\5
  216. $\\{xchr}[\O{163}]\K\.{\'s\'}$;\5
  217. $\\{xchr}[\O{164}]\K\.{\'t\'}$;\5
  218. $\\{xchr}[\O{165}]\K\.{\'u\'}$;\5
  219. $\\{xchr}[\O{166}]\K\.{\'v\'}$;\5
  220. $\\{xchr}[\O{167}]\K\.{\'w\'}$;\6
  221. $\\{xchr}[\O{170}]\K\.{\'x\'}$;\5
  222. $\\{xchr}[\O{171}]\K\.{\'y\'}$;\5
  223. $\\{xchr}[\O{172}]\K\.{\'z\'}$;\5
  224. $\\{xchr}[\O{173}]\K\.{\'\{\'}$;\5
  225. $\\{xchr}[\O{174}]\K\.{\'|\'}$;\5
  226. $\\{xchr}[\O{175}]\K\.{\'\}\'}$;\5
  227. $\\{xchr}[\O{176}]\K\.{\'\~\'}$;\6
  228. $\\{xchr}[0]\K\.{\'\ \'}$;\5
  229. $\\{xchr}[\O{177}]\K\.{\'\ \'}$;\C{ascii codes 0 and \O{177} do not appear in
  230. text}\par
  231. \A sections 10, 11, and 14.
  232. \U section 2.\fi
  233. \M9. Some of the ascii codes without visible characters have been given
  234. symbolic
  235. names in this program because they are used with a special meaning.
  236. \Y\P\D \37$\\{null\_code}=\O{0}$\C{ascii code that might disappear}\par
  237. \P\D \37$\\{carriage\_return}=\O{15}$\C{ascii code used at end of line}\par
  238. \P\D \37$\\{invalid\_code}=\O{177}$\C{ascii code that should not appear}\par
  239. \M10. The ascii code is ``standard'' only to a certain extent, since many
  240. computer installations have found it advantageous to have ready access
  241. to more than 94 printing characters. Appendix@C of the \TeX\ manual
  242. gives a complete specification of the intended correspondence between
  243. characters and \TeX's internal representation.
  244. If \TeX\ is being used
  245. on a garden-variety \PASCAL\ for which only standard ascii
  246. codes will appear in the input and output files, it doesn't really matter
  247. what codes are specified in $\\{xchr}[1\to\O{37}]$, but the safest policy is to
  248. blank everything out by using the code shown below.
  249. However, other settings of \\{xchr} will make \TeX\ more friendly on
  250. computers that have an extended character set, so that users can type things
  251. like \.\NE\ instead of \.{\\ne}. At MIT, for example, it would be more
  252. appropriate to substitute the code
  253. $$\hbox{ \&{for} $\|i\K1\mathrel{\&{to}}\O{37}$ \&{do} $\\{xchr}[\|i]\K\\
  254. {chr}(\|i)$;}$$
  255. \TeX's character set is essentially the same as MIT's, even with respect to
  256. characters less than@\O{40}. People with extended character sets can
  257. assign codes arbitrarily, giving an \\{xchr} equivalent to whatever
  258. characters the users of \TeX\ are allowed to have in their input files,
  259. provided that unsuitable characters do not correspond to the special
  260. codes like \\{carriage\_return} that are listed above. It is best
  261. to make the codes correspond to the intended interpretations as shown
  262. in Appendix@C whenever possible, because of the way \TeX\ will interpret
  263. characters when no \.{\\chcode} and \.{\\mathcode}
  264. commands have changed the default interpretation; but this is not
  265. necessary. For example, in countries with an alphabet of more than 26
  266. letters, it is usually best to map the additional letters into codes less
  267. than@\O{40}.
  268. \Y\P$\4\X8:Set initial values of key variables\X\mathrel{+}\S$\6
  269. \&{for} $\|i\K1\mathrel{\&{to}}\O{37}$ \1\&{do}\5
  270. $\\{xchr}[\|i]\K\.{\'\ \'}$;\2\par
  271. \M11. The following system-independent code makes the \\{xord} array contain a
  272. suitable inverse to the information in \\{xchr}. Note that if $\\{xchr}[\|i]=\\
  273. {xchr}[\|j]$
  274. where $\|i<\|j<\O{177}$, the value of $\\{xord}[\\{xchr}[\|i]]$ will turn out
  275. to be
  276. \|j or more; hence, standard ascii code numbers will be used instead of
  277. codes below \O{40} in case there is a coincidence.
  278. \Y\P$\4\X8:Set initial values of key variables\X\mathrel{+}\S$\6
  279. \&{for} $\|i\K\\{first\_text\_char}\mathrel{\&{to}}\\{last\_text\_char}$ \1\&
  280. {do}\5
  281. $\\{xord}[\\{chr}(\|i)]\K\\{invalid\_code}$;\2\6
  282. \&{for} $\|i\K1\mathrel{\&{to}}\O{176}$ \1\&{do}\5
  283. $\\{xord}[\\{xchr}[\|i]]\K\|i$;\2\par
  284. \N12.  String handling.
  285. (The following material is copied from the \\{init\_strings} procedure of
  286. \TeX82, with slight changes.)
  287. \Y\P$\4\X7:Globals in the outer block\X\mathrel{+}\S$\6
  288. \4$\|k,\39\|l$: \37$0\to127$;\C{small indices or counters}\6
  289. \4$\|m,\39\|n$: \37\\{text\_char};\C{characters input from \\{pool\_file}}\6
  290. \4\|s: \37\\{integer};\C{number of strings treated so far}\par
  291. \M13. The global variable \\{count} keeps track of the total number of
  292. characters
  293. in strings.
  294. \Y\P$\4\X7:Globals in the outer block\X\mathrel{+}\S$\6
  295. \4\\{count}: \37\\{integer};\C{how long the string pool is, so far}\par
  296. \M14. \P$\X8:Set initial values of key variables\X\mathrel{+}\S$\6
  297. $\\{count}\K0$;\par
  298. \M15. This is the main program, where \.{POOLtype} starts and ends.
  299. \Y\P\D \37$\\{abort}(\#)\S$\1\6
  300. \&{begin} \37$\\{write\_ln}(\#)$;\5
  301. \&{goto} \379999;\6
  302. \&{end}\2\par
  303. \Y\P\&{begin} \37\\{initialize};\6
  304. \X16:Make the first 128 strings\X;\6
  305. $\|s\K128$;\6
  306. \X19:Read the other strings from the \.{POOL} file, or give an error message
  307. and abort\X;\6
  308. $\\{write\_ln}(\.{\'(\'},\39\\{count}:1,\39\.{\'\ characters\ in\ all.)\'})$;\6
  309. \49999: \37\&{end}.\par
  310. \M16. \P$\X16:Make the first 128 strings\X\S$\6
  311. \&{for} $\|k\K0\mathrel{\&{to}}127$ \1\&{do}\6
  312. \&{begin} \37$\\{write}(\|k:3,\39\.{\':\ "\'})$;\6
  313. \&{if} $(\|k<\.{"\ "})\W(\X17:Character \|k cannot be printed\X)$ \1\&{then}\6
  314. \&{begin} \37$\\{write}(\\{xchr}[\.{"\^"}],\39\\{xchr}[\.{"\^"}],\39\\{xchr}[\|
  315. k+\O{100}])$;\5
  316. $\\{count}\K\\{count}+2$;\6
  317. \&{end}\6
  318. \4\&{else} \&{if} $\|k=127$ \1\&{then}\6
  319. \&{begin} \37$\\{write}(\\{xchr}[\.{"\^"}],\39\\{xchr}[\.{"\^"}],\39\\{xchr}[\.
  320. {"?"}])$;\5
  321. $\\{count}\K\\{count}+2$;\6
  322. \&{end}\6
  323. \4\&{else} \&{if} $\|k=\.{""}\.{""}$ \1\&{then}\5
  324. $\\{write}(\\{xchr}[\|k],\39\\{xchr}[\|k])$\6
  325. \4\&{else} $\\{write}(\\{xchr}[\|k])$;\2\2\2\6
  326. $\\{incr}(\\{count})$;\5
  327. $\\{write\_ln}(\.{\'"\'})$;\6
  328. \&{end}\2\par
  329. \U section 15.\fi
  330. \M17. The first 128 strings will contain 95 standard ascii characters, and the
  331. other 33 characters will be printed in three-symbol form like `\.{\^\^A}'
  332. unless a system-dependent change is made here. Installations that have
  333. an extended character set, where for example $\\{xchr}[\O{32}]=\hbox{\.{\'\NE\'
  334. would like string \O{32} to be the single character \O{32} instead of the
  335. three characters \O{136}, \O{136}, \O{132} (\.{\^\^Z}). On the other hand,
  336. even people with an extended character set will want to represent string
  337. \O{15} by \.{\^\^M}, since \O{15} is \\{carriage\_return}; the idea is to
  338. produce visible strings instead of tabs or line-feeds or carriage-returns
  339. or bell-rings or characters that are treated anomalously in text files.
  340. The boolean expression defined here should be \\{true} unless \TeX\ internal
  341. $k$ corresponds to a non-troublesome visible symbol in the local character
  342. set, given that $\|k<\O{40}$.
  343. At MIT, for example, the appropriate formula would be
  344. `$\|k\in[0,\O{10}\to\O{12},\O{14},\O{15},\O{33}]$'.
  345. \Y\P$\4\X17:Character \|k cannot be printed\X\S$\6
  346. \\{true}\par
  347. \U section 16.\fi
  348. \M18. When the \.{WEB} system program called \.{TANGLE} processes a source
  349. file,
  350. it outputs a \PASCAL\ program and also a string pool file. The present
  351. program reads the latter file, where each string appears as a two-digit decimal
  352. length followed by the string itself, and the information is output with its
  353. associated index number. The strings are surrounded by double-quote marks;
  354. double-quotes in the string itself are repeated.
  355. \Y\P$\4\X7:Globals in the outer block\X\mathrel{+}\S$\6
  356. \4\\{pool\_file}: \37\&{packed} \37\&{file} \1\&{of}\5
  357. \\{text\_char};\C{the string-pool file output by \.{TANGLE}}\2\6
  358. \4\\{xsum}: \37\\{boolean};\C{has the check sum been found?}\par
  359. \M19. \P$\X19:Read the other strings from the \.{POOL} file, or give an error
  360. message and abort\X\S$\6
  361. $\\{reset}(\\{pool\_file})$;\5
  362. $\\{xsum}\K\\{false}$;\6
  363. \&{if} $\\{eof}(\\{pool\_file})$ \1\&{then}\5
  364. $\\{abort}(\.{\'!\ I\ can\'}\.{\'t\ read\ the\ POOL\ file.\'})$;\2\6
  365. \1\&{repeat} \37\X20:Read one string, but abort if there are problems\X;\6
  366. \4\&{until}\5
  367. \\{xsum};\2\6
  368. \&{if} $\R\\{eof}(\\{pool\_file})$ \1\&{then}\5
  369. $\\{abort}(\.{\'!\ There\'}\.{\'s\ junk\ after\ the\ check\ sum\'})$\2\par
  370. \U section 15.\fi
  371. \M20. \P$\X20:Read one string, but abort if there are problems\X\S$\6
  372. \&{if} $\\{eof}(\\{pool\_file})$ \1\&{then}\5
  373. $\\{abort}(\.{\'!\ POOL\ file\ contained\ no\ check\ sum\'})$;\2\6
  374. $\\{read}(\\{pool\_file},\39\|m,\39\|n)$;\C{read two digits of string length}\6
  375. \&{if} $\|m\I\.{\'*\'}$ \1\&{then}\6
  376. \&{begin} \37\&{if} $(\\{xord}[\|m]<\.{"0"})\V(\\{xord}[\|m]>\.{"9"})\V(\\
  377. {xord}[\|n]<\.{"0"})\V(\\{xord}[\|n]>\.{"9"})$ \1\&{then}\5
  378. $\\{abort}(\.{\'!\ POOL\ line\ doesn\'}\.{\'t\ begin\ with\ two\ digits\'})$;\2
  379. $\|l\K\\{xord}[\|m]\ast10+\\{xord}[\|n]-\.{"0"}\ast11$;\C{compute the length}\6
  380. $\\{write}(\|s:3,\39\.{\':\ "\'})$;\5
  381. $\\{count}\K\\{count}+\|l$;\6
  382. \&{for} $\|k\K1\mathrel{\&{to}}\|l$ \1\&{do}\6
  383. \&{begin} \37\&{if} $\\{eoln}(\\{pool\_file})$ \1\&{then}\6
  384. \&{begin} \37$\\{write\_ln}(\.{\'"\'})$;\5
  385. $\\{abort}(\.{\'!\ That\ POOL\ line\ was\ too\ short\'})$;\6
  386. \&{end};\2\6
  387. $\\{read}(\\{pool\_file},\39\|m)$;\5
  388. $\\{write}(\\{xchr}[\\{xord}[\|m]])$;\6
  389. \&{if} $\\{xord}[\|m]=\.{""}\.{""}$ \1\&{then}\5
  390. $\\{write}(\\{xchr}[\.{""}\.{""}])$;\2\6
  391. \&{end};\2\6
  392. $\\{write\_ln}(\.{\'"\'})$;\5
  393. $\\{incr}(\|s)$;\6
  394. \&{end}\6
  395. \4\&{else} $\\{xsum}\K\\{true}$;\2\6
  396. $\\{read\_ln}(\\{pool\_file})$\par
  397. \U section 19.\fi
  398. \N21.  System-dependent changes.
  399. This module should be replaced, if necessary, by changes to the program
  400. that are necessary to make \.{POOLtype} work at a particular installation.
  401. It is usually best to design your change file so that all changes to
  402. previous modules preserve the module numbering; then everybody's version
  403. will be consistent with the printed program. More extensive changes,
  404. which introduce new modules, can be inserted here; then only the index
  405. itself will get a new module number.
  406. \N*22.  Index.
  407. Indications of system dependencies appear here together with the section
  408. numbers
  409. where each ident\-i\-fier is used.
  410. \+\\{abort}, \[15], 19, 20.
  411. \+{ascii code}, 4.
  412. \+\\{ascii\_code}, \[5], 6, 7.
  413. \+\&{begin}, \[2].
  414. \+\\{boolean}, 18.
  415. \+\\{carriage\_return}, \[9], 10, 17.
  416. \+\\{char}, 6.
  417. \+{character set dependencies}, 10, 17.
  418. \+\\{chr}, 6, 7, 10, 11.
  419. \+\\{count}, \[13], 14, 15, 16, 20.
  420. \+\\{decr}, \[3].
  421. \+\\{do\_nothing}, \[3].
  422. \+\\{eof}, 19, 20.
  423. \+\\{eoln}, 20.
  424. \+\\{false}, 19.
  425. \+\\{first\_text\_char}, \[6], 11.
  426. \+\\{incr}, \[3], 16, 20.
  427. \+\\{init\_strings}, 12.
  428. \+\\{initialize}, \[2], 15.
  429. \+\\{integer}, 12, 13.
  430. \+\\{invalid\_code}, \[9], 11.
  431. \+\|{k}, \[12].
  432. \+\|{l}, \[12].
  433. \+\\{last\_text\_char}, \[6], 11.
  434. \+\|{m}, \[12].
  435. \+\|{n}, \[12].
  436. \+\\{null\_code}, \[9].
  437. \+\\{ord}, 7.
  438. \+\\{output}, \[2].
  439. \+\\{pool\_file}, \[2], 12, \[18], 19, 20.
  440. \+\\{POOLtype}, \[2].
  441. \+\\{read}, 20.
  442. \+\\{read\_ln}, 20.
  443. \+\\{reset}, 19.
  444. \+\|{s}, \[12].
  445. \+{system dependencies}, 2, 6, 10, 17, 21.
  446. \+\\{text\_char}, \[6], 7, 12, 18.
  447. \+\\{true}, 17, 20.
  448. \+\\{write}, 16, 20.
  449. \+\\{write\_ln}, 15, 16, 20.
  450. \+\\{xchr}, \[7], 8, 10, 11, 16, 17, 20.
  451. \+\\{xord}, \[7], 11, 20.
  452. \+\\{xsum}, \[18], 19, 20.
  453. \+\X17:Character \|k cannot be printed\X
  454. \+\X7:Globals in the outer block\X
  455. \+\X6:Local variables for initialization\X
  456. \+\X16:Make the first 128 strings\X
  457. \+\X20:Read one string, but abort if there are problems\X
  458. \+\X19:Read the other strings from the \.{POOL} file, or give an error message
  459. and abort\X
  460. \+\X8:Set initial values of key variables\X
  461. \+\X5:Types in the outer block\X
  462.